<?php

namespace App\Http\Controllers\Car;

use App\Exports\CommonExport;
use App\Http\Controllers\Controller;
use App\Models\CarModels\CarCheck;
use App\Models\CarModels\CarCheckFiles;
use App\Models\CarModels\CarInfo;
use App\Models\CarModels\CarInsuranceRecord;
use App\Models\CarModels\CarKind;
use http\Env\Response;
use Illuminate\Http\Request;
use App\Models\CarModels\CarArea;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\DB;
use Validator;

/**
 * @group 运营管理->车辆基础信息管理->车辆验收
 *
 * 采用 restful api
 *
 * Body Parameters 表示请求的所需要的参数
 *
 * Query Parameters 表示返回参数的名称
 */
class CarCheckController extends Controller
{
    /**
     * 车辆验收查看
     *
     * @queryParam  reason 拒收原因
     * @queryParam  accept_time 接受时间
     * @queryParam  is_accept 是否接受
     * @queryParam  car_id 接受车辆
     * @queryParam  is_compete 证件是否齐全
     * @queryParam  is_ok 点检是否有问题
     * @queryParam  status '状态 1. 待交接 2. 拒收 3. 可用'
     * @queryParam  has_accident 是否有事故
     * @queryParam  has_punish 是否有处罚
     * @queryParam  year_check 年检日期
     * @queryParam  car_status 车辆状况 0.良好 1.待维修
     *
     * @queryParam  search string optional 查找车辆牌号 模糊
     * @queryParam  accept int optional 筛选接受状态
     *
     * @queryParam  status int optional 筛选状态
     */
    public function index(Request $request){

        $query = CarCheck::with(['car','img'])->whereHas('car',function ($q) use ($request){
            $request->has('search') && $q->where('plates_number','like',"%{$request->get('search')}%");
        })->where(function ($q) use($request){
           $request->has('status') && $q->where('status',$request->get('status'));
        });
        return response()->json(encodeMsg(pageQuery($query,$request),200));
    }

    /**
     *
     * 车辆验收添加
     *
     * @queryParam  reason 拒收原因
     * @queryParam  accept_time 接受时间
     * @queryParam  is_accept 是否接受
     * @queryParam  car_id 接受车辆
     * @queryParam  is_compete 证件是否齐全
     * @queryParam  is_ok 点检是否有问题
     * @queryParam  status '状态 1. 待交接 2. 拒收 3. 可用'
     * @queryParam  has_accident 是否有事故
     * @queryParam  has_punish 是否有处罚
     * @queryParam  year_check 年检日期
     * @queryParam  car_status 车辆状况
     *
     * @bodyParam  reason string required 拒收原因
     * @bodyParam  accept_time datetime optional 接受时间
     * @bodyParam  is_accept int required 是否接受
     * @bodyParam  car_id int required 接受车辆 外键 对应车辆信息
     * @bodyParam  is_compete bool required 证件是否齐全
     * @bodyParam  is_ok bool required 点检是否有问题
     * @bodyParam  has_accident bool optional 是否有事故
     * @bodyParam  has_punish bool optional 是否有处罚
     * @bodyParam  status int required 状态 1. 待交接 2. 拒收 3. 可用'
     * @bodyParam  year_check time required 年检日期
     * @bodyParam  car_status int required 车辆状况 0.良好 1.待维修
     * @bodyParam  img 证件上传 json required [1,2,3]
     *
     */
    public function store(Request $request){

        try{
            $e = genValidate();
            $validator = Validator::make($request->all(),$e);
            $row=$request->all();
            if($validator->fails()){
                return response()->json(encodeMsg($validator->errors()->messages(),400),400);
            }
            if ($request->has('img')){
                DB::beginTransaction();
                unset($row['img']);
                $id=CarCheck::insertGetId($row);
                if (!$id){
                    DB::rollBack();
                    return response()->json(encodeMsg(["message"=>"添加失败"],501),501);
                }
                $img=json_decode($request->get('img'),true);
                foreach ($img as $v){
                    $file=array(
                        'check_id'=>$id,
                        'file_id'=>$v
                    );
                    $check=CarCheckFiles::insertGetId($file);
                    if (!$check){
                        DB::rollBack();
                        return response()->json(encodeMsg(["message"=>"图片添加失败"],502),502);
                    }
                }

                $data=CarCheck::find($id);
                DB::commit();
            }else{
                $data=CarCheck::create($request->all());
            }
            return response()->json(encodeMsg($data,201),201);
        }catch (QueryException $e){
            return response()->json(encodeMsg(["message"=>"添加失败"],500),500);
        }
    }

    /**
     * 车辆验收查看单条
     *
     * @queryParam  reason 拒收原因
     * @queryParam  accept_time 接受时间
     * @queryParam  is_accept 是否接受
     * @queryParam  car_id 接受车辆
     * @queryParam  is_compete 证件是否齐全
     * @queryParam  is_ok 点检是否有问题
     * @queryParam  status '状态 1. 待交接 2. 拒收 3. 可用'
     * @queryParam  year_check 年检日期
     * @queryParam  car_status 车辆状况 0.良好 1.待维修
     *
     */
    public function show($pk){
        $data = CarCheck::with(['car','img'])->find($pk);
        if($data == []){
            return response()->json(encodeMsg(["message"=>"没有该信息"],404),404);
        }else{
            return response()->json(encodeMsg($data,200),200);
        }
    }

    /**
     * 车辆所属区信息修改
     *
     * @queryParam  reason 拒收原因
     * @queryParam  accept_time 接受时间
     * @queryParam  is_accept 是否接受
     * @queryParam  car_id 接受车辆
     * @queryParam  is_compete 证件是否齐全
     * @queryParam  is_ok 点检是否有问题
     * @queryParam  status '状态 1. 待交接 2. 拒收 3. 可用'
     * @queryParam  year_check 年检日期
     * @queryParam  car_status 车辆状况
     *
     * @bodyParam  reason string optional 拒收原因
     * @bodyParam  accept_time datetime optional 接受时间
     * @bodyParam  is_accept int optional 是否接受
     * @bodyParam  car_id int optional 接受车辆 外键 对应车辆信息
     * @bodyParam  is_compete bool optional 证件是否齐全
     * @bodyParam  is_ok bool optional 点检是否有问题
     * @bodyParam  status int optional 状态 1. 待交接 2. 拒收 3. 可用'
     * @bodyParam  has_accident bool optional 是否有事故
     * @bodyParam  has_punish bool optional 是否有处罚
     * @bodyParam  year_check time required 年检日期
     * @bodyParam  car_status int required 车辆状况 0.良好 1.待维修
     * @bodyParam  img json optional  证件上传  [4,{"id":2}]
     */
    public function update(Request $request, $pk){
        $e = genValidate();
        $validator = Validator::make($request->all(),$e);
        if($validator->fails()){
            return response()->json(encodeMsg($validator->errors()->messages(),400),400);
        }
        $carkind = CarCheck::find($pk);
        if($carkind == []){
            return response()->json(encodeMsg(["message"=>"没有该信息"],404),404);
        }

        try {
            DB::beginTransaction();
            if ($request->has('car_type')){
                    $car=CarInfo::find($request->get('car_id'));
                    $car->plates_number = $request->get('car_plate');
                    $car->register_time = $request->get('record_time');
                    $car->buy_time = $request->get('buy_time');
                    $kind=CarKind::find($request->get('kind_id'));
                    $kind->name =$request->get('car_name');
                    $car->save();
                    $kind->save();
            }
            if ($request->has('record_id')){
                $record=CarInsuranceRecord::find($request->get('record_id'));
                $record->insurance_time = $request->get('insurance_time');
                $record->insurance_company = $request->get('insurance_company');
                $record->insurance_number = $request->get('insurance_number');
            }
            if ($request->has('img')){
                $img=json_decode($request->get('img'),true);
                if (!$img)
                    return response()->json(encodeMsg(["message"=>"img格式错误"],404),404);
                foreach ($img as $k=>$v){
                    if ($v['id']!=null){  //删除图片
                        $delete=CarCheckFiles::where(['check_id'=>$pk,'file_id'=>$v['id']])->first();
                        if ($delete!=null){
                            CarCheckFiles::where('id',$delete['id'])->delete();
                        }else{
                            return response()->json(encodeMsg(["message"=>"图片id".$v."没有找到"],404),404);
                        }
                    }else{ //添加图片
                        $add=array(
                            'check_id'=>$pk,
                            'file_id'=>$v
                        );
                        CarCheckFiles::create($add);
                    }
                }
            }else{
                $carkind->update($request->all());
            }
            DB::commit();
            return response()->json(encodeMsg($carkind,200), 200);
        }catch (QueryException $e){
            DB::rollBack();
            return response()->json(encodeMsg($e->getMessage(),500),500);
        }
    }

    /**
     * 车辆所属区信息删除
     */

    public function destroy($pk){
        $data = CarCheck::find($pk);
        if($data == []){
            return response()->json(encodeMsg(["message"=>"没有该信息"],404),404);
        }
        $data->delete();
        return response()->json(encodeMsg(["message"=>"删除成功"],204),200);
    }



    /**
     * 车辆信息导出 excel 测试用
     * @queryParam id 序号
     * @queryParam car->number 车辆识别码
     * @queryParam car->plates_number 车牌号
     * @queryParam car->kind->name 车辆类型
     * @queryParam car->brand 车辆品牌
     * @queryParam is_compete 证件是否齐全
     * @queryParam is_ok 点检是否有问题
     * @queryParam status '状态 1. 待交接 2. 拒收 3. 可用'
     * @queryParam accept_time 接受时间
     */
    public function export()
    {
        $headers = genExport();
        return (new CommonExport($headers,CarCheck::class))->download('invoices.xlsx');
    }
}
